<?php
if (!defined('ADODB_DIR')) die();

include_once(ADODB_DIR.'/drivers/adodb-oci8.inc.php');

class ADODB_oci8po extends ADODB_oci8 {
	var $databaseType = 'oci8po';
	var $dataProvider = 'oci8';
	var $metaColumnsSQL = "select lower(cname),coltype,width, SCALE, PRECISION, NULLS, DEFAULTVAL from col where tname='%s' order by colno"; //changed by smondino@users.sourceforge. net
	var $metaTablesSQL = "select lower(table_name),table_type from cat where table_type in ('TABLE','VIEW')";
	
	function ADODB_oci8po()
	{
		$this->_hasOCIFetchStatement = ADODB_PHPVER >= 0x4200;
	}
	
	function Param($name,$type='C')
	{
		return '?';
	}
	
	function Prepare($sql,$cursor=false)
	{
		$sqlarr = explode('?',$sql);
		$sql = $sqlarr[0];
		for ($i = 1, $max = sizeof($sqlarr); $i < $max; $i++) {
			$sql .=  ':'.($i-1) . $sqlarr[$i];
		} 
		return ADODB_oci8::Prepare($sql,$cursor);
	}
	
	function Execute($sql,$inputarr=false) 
	{
		return ADOConnection::Execute($sql,$inputarr);
	}
	function _query($sql,$inputarr=false)
	{
		if (is_array($inputarr)) {
			$i = 0;
			if (is_array($sql)) {
				foreach($inputarr as $v) {
					$arr['bind'.$i++] = $v;
				} 
			} else {
				$sqlarr = explode('?',$sql);
				$sql = $sqlarr[0];
				foreach($inputarr as $k => $v) {
					$sql .=  ":$k" . $sqlarr[++$i];
				}
			}
		}
		return ADODB_oci8::_query($sql,$inputarr);
	}
}
class ADORecordset_oci8po extends ADORecordset_oci8 {

	var $databaseType = 'oci8po';
	
	function ADORecordset_oci8po($queryID,$mode=false)
	{
		$this->ADORecordset_oci8($queryID,$mode);
	}

	function Fields($colname)
	{
		if ($this->fetchMode & OCI_ASSOC) return $this->fields[$colname];
		
		if (!$this->bind) {
			$this->bind = array();
			for ($i=0; $i < $this->_numOfFields; $i++) {
				$o = $this->FetchField($i);
				$this->bind[strtoupper($o->name)] = $i;
			}
		}
		 return $this->fields[$this->bind[strtoupper($colname)]];
	}
	function _FetchField($fieldOffset = -1)
	{
		 $fld = new ADOFieldObject;
 		 $fieldOffset += 1;
		 $fld->name = OCIcolumnname($this->_queryID, $fieldOffset);
		 if (ADODB_ASSOC_CASE == 0) $fld->name = strtolower($fld->name);
		 $fld->type = OCIcolumntype($this->_queryID, $fieldOffset);
		 $fld->max_length = OCIcolumnsize($this->_queryID, $fieldOffset);
		 if ($fld->type == 'NUMBER') {
			$sc = OCIColumnScale($this->_queryID, $fieldOffset);
			if ($sc == 0) $fld->type = 'INT';
		 }
		 return $fld;
	}
	function MoveNext() 
	{
		if(@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) {
		global $ADODB_ANSI_PADDING_OFF;
			$this->_currentRow++;
			
			if ($this->fetchMode & OCI_ASSOC) $this->_updatefields();
			if (!empty($ADODB_ANSI_PADDING_OFF)) {
				foreach($this->fields as $k => $v) {
					if (is_string($v)) $this->fields[$k] = rtrim($v);
				}
			}
			return true;
		}
		if (!$this->EOF) {
			$this->EOF = true;
			$this->_currentRow++;
		}
		return false;
	}
	function GetArrayLimit($nrows,$offset=-1) 
	{
		if ($offset <= 0) {
			$arr = $this->GetArray($nrows);
			return $arr;
		}
		for ($i=1; $i < $offset; $i++) 
			if (!@OCIFetch($this->_queryID)) {
				$arr = array();
				return $arr;
			}
		if (!@OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode)) {
			$arr = array();
			return $arr;
		}
		if ($this->fetchMode & OCI_ASSOC) $this->_updatefields();
		$results = array();
		$cnt = 0;
		while (!$this->EOF && $nrows != $cnt) {
			$results[$cnt++] = $this->fields;
			$this->MoveNext();
		}
		
		return $results;
	}
	function _updatefields()
	{
		if (ADODB_ASSOC_CASE == 2) return; // native
	
		$arr = array();
		$lowercase = (ADODB_ASSOC_CASE == 0);
		
		foreach($this->fields as $k => $v) {
			if (is_integer($k)) $arr[$k] = $v;
			else {
				if ($lowercase)
					$arr[strtolower($k)] = $v;
				else
					$arr[strtoupper($k)] = $v;
			}
		}
		$this->fields = $arr;
	}
	
	function _fetch() 
	{
		$ret = @OCIfetchinto($this->_queryID,$this->fields,$this->fetchMode);
		if ($ret) {
		global $ADODB_ANSI_PADDING_OFF;
	
				if ($this->fetchMode & OCI_ASSOC) $this->_updatefields();
				if (!empty($ADODB_ANSI_PADDING_OFF)) {
					foreach($this->fields as $k => $v) {
						if (is_string($v)) $this->fields[$k] = rtrim($v);
					}
				}
		}
		return $ret;
	}
	
}


?>